package com.op.service;

import com.github.yulichang.base.MPJBaseService;
import com.op.entity.Menu;
import com.op.model.vo.ComponentRouterVo;
import com.op.model.vo.NavigationMenuTreeVo;
import com.op.model.vo.SelectMenuVo;

import java.util.List;

/**
 * (Menu)表服务接口
 *
 * @author 孤焰
 * @since 2021-12-25 15:27:27
 */
public interface MenuService extends MPJBaseService<Menu> {

    /**
     * 查询菜单列表
     * @param menu 查询条件
     * @return 菜单列表
     */
    List<Menu> selectMenuList(Menu menu);

    /**
     * 查询菜单列表（级联Role）
     * @param menu 查询条件
     * @param roleId 角色Id
     * @return 菜单列表
     */
    List<Menu> selectMenuListJoinRole(Menu menu, Long roleId);

    /**
     * 查询菜单树列表（相对策略）
     * @param menu 查询条件
     * @return 菜单树列表
     */
    List<Menu> selectMenuTree(Menu menu);

    /**
     * 查询菜单树列表（绝对策略）
     * @param menu 查询条件
     * @return 菜单树列表
     */
    List<Menu> selectMenuTreeAbsolute(Menu menu);

    /**
     * 查询菜单树列表（级联Role  绝对策略）
     * @param menu 查询条件
     * @param roleId 角色Id
     * @return 菜单树列表
     */
    List<Menu> selectMenuTreeJoinRoleAbsolute(Menu menu, Long roleId);

    /**
     * 查询菜单下拉树列表
     * @param menu 查询条件
     * @return 菜单下拉树列表
     */
    List<SelectMenuVo> menuTreeLabel(Menu menu);

    /**
     * 检查同级菜单的菜单名称是否重复
     * @param menu 实体对象
     * @return true 存在重复的菜单名称 false 不存在重复的菜单名称
     */
    boolean hasUniqueByMenuName(Menu menu);

    /**
     * 检查菜单项是否存在子菜单
     * @param id 菜单项id
     * @return true 存在 false 不存在
     */
    boolean hasChildMenu(Long id);

    /**
     * 检查菜单项是否存在绑定角色
     * @param id 菜单项id
     * @return ture 存在 false 不存在
     */
    boolean hasBindingWithRole(Long id);

    /**
     * 查询导航菜单树
     * @param roleId 角色Id
     * @return 导航菜单树
     */
    List<NavigationMenuTreeVo> navigationMenuTree(Long roleId);

    /**
     * 查询所有的组件路由及绑定的角色
     * @return 组件路由Vo类
     */
    List<ComponentRouterVo> componentRouter();
}

